到目前為止,這系列文章已經介紹了非常多的功能,我想,各位應該也遇過不少 Bug 了。所以,差不多是時候來介紹一下 Discord BOT 的日誌系統與錯誤處理 XD
如果這系列文章有分階段的話,今天開始應該算第三階段 (第一階段是入門,第二階段是重要功能介紹)。這階段的內容都會比較偏向 Discord BOT 的維護 (e.g. 日誌系統、錯誤處理、檔案拆分) 與部屬。
今天要介紹的日誌系統,雖然被分類在 Discord BOT 設定中,但考量到希望它能夠與錯誤處理一起討論,所以刻意留到等大部分功能就介紹完才回頭寫這個主題。
不知道大家有沒有注意過,其實在執行 Discord BOT 時,Terminal 所印出來的就是 Log 訊息 (第一次執行 Discord BOT Quickstart 就有了)。
可以看到,預設的 Log 訊息包含了日期、時間、Log 層級、logger 名稱、訊息,甚至還有設定顏色 XD
discord.py
的日誌系統,其實使用的是 python 的 logging 模組,並且有預留參數在 client.run
中。知道這件事之後,其實就有很多可以玩的東西了,接下來會開始介紹幾個常見的調整和應用。
如果想要自己手動添加 Log 紀錄的話,可以用這個方式取得 logger
logger = logging.getLogger('discord')
之後,只要在有需要的地方加上 log 就好。
@bot.command()
async def ping(ctx: commands.Context):
logger.info("Ping Pong!")
await ctx.send("Pong!")
觸發後,就可以在 terminal 看到剛剛 Log 紀錄。
如果對於日誌系統的預設設定不滿意的話,也可以進行調整。在 client.run
中,有預留幾個參數:
log_handler
log_formatter
log_level
log_rooter
接下來,就直接舉幾個比較常見的需求為例,讓大家更直接地知道這些參數怎麼使用。
import logging
handler = logging.FileHandler(filename='discord.log', encoding='utf-8', mode='w')
client.run(token, log_handler=handler)
檔案打開來長這樣:
client.run(token, log_handler=None)
import logging
client.run(token, log_level=logging.DEBUG)
如果 Discord BOT 需要開發比較特殊的功能,可以把 Log 層級調低,會多很多可以參考資訊。這邊我就截一小部分給大家感受一下 (一樣只是用 Quickstart 範例程式啟動而已)。
import logging
dt_fmt = "%Y-%m-%d %H:%M:%S"
formatter = logging.Formatter(
"{asctime} | {levelname:<8} | {filename}:{funcName}:{lineno} - {message}",
dt_fmt,
style="{",
)
client.run(token, log_formatter=formatter,)
如果想要紀錄更詳細的內容,也可以直接修改 Log 格式。上面的程式碼的效果如下:
這個應該比較少用到
discord.py
其實有很多個 logger,光是 Quickstart 範例就會觸發到 2 個 (discord.client
與 discord.gateway
),而且除了 discord
系列之外,也還有其他的。前面那些改動都只是針對 discord
系列,如果全部都要一起調整的話,就加上 root_logger=True
就好。
client.run(token, log_handler=handler, root_logger=True)
想知道到底有哪些 logger 的讀者,可以執行這段程式碼:
import logging for key in logging.Logger.manager.loggerDict: print(key)
如果上面這幾種都還無法滿足需求,其實也可以再更深入地去研究 python 的 logging 模組 (官方教學),或甚至用其他 log 相關的模組把它覆蓋掉。
偷偷推廣一下我去年寫的文章,介紹了 FastAPI 日誌系統的設定,有許多觀念是相通的~
今天介紹了 discord.py
的日誌系統的設定,明天會接著介紹 Discord BOT 的錯誤處理。
明天竟然真的要放颱風假了XD